/**
 * @file UsuarioBD.java
 * Clase controlador que interactúa con la interfaz y con la BD
 * 
 * Esta clase interactúa con la interfaz y la Base de Datos para gestionar
 * todo lo relativo a los usuarios.
 * Se implementa siguiendo el patrón de Diseño "Singleton"
 * 
 * @author ANASS BENALI
 * @version 1.0
 */


package GestorUsuarios;

import ConexionBD.*;
import java.sql.*;


public class UsuarioBD {
    
    private static UsuarioBD Instancia = null;
    
    public UsuarioBD(){}
    
    
    public static UsuarioBD getInstancia() {
        
        if(Instancia==null) {
            Instancia = new UsuarioBD();
        }
        return Instancia;
    }
    
    
     @Override
    /**
     * Sobrecarga del método clone para impedir que se duplique la instancia
     * (Exigencias del patrón Singleton)
     * @param void
     * @return Object
     */
    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException(); 
    }
     
     /**
     * Método que añade un objeto Usuario a la Base de Datos
     * Si se pretende modificar un Usuario existente en la Base de Datos
     * utilizar el método updateUsuario
     * @param user Objeto Usuario a añadir
     * @return El objeto Usuario con el atributo usuarioId actualizado si
     * acabó con éxito o null si hubo algún error
     * @author ANASS BENALI
     */
    public Usuario addUsuario(Usuario user) {
      
        
        String consulta="INSERT INTO Usuario(DNI,Nombre,Apellidos,Login,Contrasena," +
                         "Correo,tipoUsuario) VALUES ('" + user.getDNI() +
            
            "','" + user.getNombre() +
            "','" + user.getApellidos() +
            "','" + user.getLogin() +
            "','" + user.getContrasena() +
            "','" + user.getCorreo() +
            "','";
           
      
        if (user.getEsGestor()) {
            consulta+="G');";
        } else {
            consulta+="E');";
        }
        
       
        try {
            ConexionBD.getInstancia().conectar();
            ResultSet salidaBD=ConexionBD.getInstancia().actualizar(consulta);
            salidaBD.first();
            // Establece el valor de IdJugador generado por la BD en el objeto jug
            user.setIdUsuario(Integer.parseInt(salidaBD.getString(1)));
            ConexionBD.getInstancia().desconectar();
        } catch (SQLException ex) {
            return null;
        }
        return user;
    }
    

    /**
     * Método que elimina un objeto Jugador de la Base de Datos
     * El Jugador en realidad no es eliminado sino que se le cambia
     * el atributo estado a 'baja' pero se mantiene en la Base de Datos
     * @param idUsuario el identificador único del Usuario en la BD
     * @return true si se modificó con éxito false si no
     * @author Carlos Rabelo
     */
    public Boolean deleteUsuario(Integer idUsuario) {
        try {
            // Hacer comprobaciones si necesario
            ConexionBD.getInstancia().conectar();
            String consulta = "DELETE FROM Usuario WHERE IdUsuario =" + idUsuario.toString() + ";";      
            ConexionBD.getInstancia().actualizar(consulta);
            ConexionBD.getInstancia().desconectar();
            
        } catch (SQLException ex) {
            return false;
        }
        return true;
    }
    
    
     /**
     * Método que hace una consulta en la tabla Usuario de la Base de Datos
     * y devuelve el usuario cuyo DNI coincide con el buscado
     * @param dniUser Nombre del usuario
     * @param 
     * @return el objeto Usuario cumpliendo los parámetros de búsqueda
     * si lo hubiera o null en caso de error o si la consulta no ha dado
     * resultados
     */
    
    public Usuario getUsuario(String dniUsuario) throws SQLException {
        String consulta  =  "SELECT * FROM Usuario WHERE Usuario.DNI LIKE '" + dniUsuario + "%';";
        
          Usuario user = new Usuario();
         
          try {
            ConexionBD.getInstancia().conectar();
            ResultSet tabla = ConexionBD.getInstancia().consultar(consulta);
            
              if(tabla.last()){
                  int numFilas = tabla.getRow();
                  tabla.beforeFirst();
                  Boolean gestor;
                  
                  for(int i=0; i<numFilas; i++){
                      tabla.next();
                      if(tabla.getString("tipoUsuario").equals("G")){
                          gestor = true;
                      }
                      else 
                          gestor = false;
                      
                      user = new Usuario(tabla.getString("DNI"), tabla.getString("Nombre"), tabla.getString("Apellidos"), tabla.getString("Login"), tabla.getString("Contrasena"), tabla.getString("Correo"), gestor);
                      user.setIdUsuario(tabla.getInt("IdUsuario"));
                  }
                }
              ConexionBD.getInstancia().desconectar();
        } catch(SQLException ex){
        return null;
        }
          
         // System.out.println("Gestor= " + user.getEsGestor());
          return user;
     }
    
    /**
     * 
     * @param dniUser
     * @return
     * @throws SQLException 
     */
    
    public Integer getidUsuario(String dniUser)throws SQLException {
        String consulta = "SELECT * FROM Usuario WHERE Usuario.DNI='" + dniUser + "';";
        
        Integer IdUser;
        IdUser = null;
          try {
            ConexionBD.getInstancia().conectar();
            ResultSet rs = ConexionBD.getInstancia().consultar(consulta);
            
            if(rs.next()){
              if(rs.getString("DNI").equals(dniUser)){
                  
                  IdUser = rs.getInt("IdUsuario");
                  
              }
          }
            ConexionBD.getInstancia().desconectar();
         } catch(SQLException ex){
            return null;
        }
          return IdUser;
    
 }
     /**
     * 
     * @param login
     * @param password
     * @return
     * @throws SQLException 
     */
    public Usuario getlogin(String login, String password) throws SQLException {
        String consulta  =  "SELECT * FROM Usuario WHERE Usuario.Login='" + login + "';";
        
          Usuario user = null;
         
          try {
            ConexionBD.getInstancia().conectar();
            ResultSet tabla = ConexionBD.getInstancia().consultar(consulta);
            
              if(tabla.next()){
                  
                  if (tabla.getString("Login").equals(login) && tabla.getString("Contrasena").equals(password)){
                      
                      Boolean gestor;
                  
                      if(tabla.getString("tipoUsuario").charAt(0)=='G'){
                          gestor = true;
                      }
                      else {
                          gestor = false;
                      }
                      
                      user = new Usuario(tabla.getString("DNI"), tabla.getString("Nombre"), tabla.getString("Apellidos"), tabla.getString("Login"), tabla.getString("Contrasena"), tabla.getString("Correo"), gestor);
                      user.setIdUsuario(tabla.getInt("IdUsuario"));
                  }
                }
              ConexionBD.getInstancia().desconectar();
        } catch(SQLException ex){
            return null;
        }
        return user;
     }
    
    /**
     * 
     * @param user
     * @return 
     */
    
    public Boolean updateUsuario(Usuario user){
        Boolean salida = true;
        

        
        String consulta  = "UPDATE Usuario SET DNI ='" + user.getDNI() +
                        "',Nombre ='" + user.getNombre() +
                        "',Apellidos ='" + user.getApellidos() +
                        "',Login ='" + user.getLogin() +
                        "',Contrasena ='" + user.getContrasena() +
                        "',Correo ='" + user.getCorreo() +
                        "',tipoUsuario='";
                        if(user.getEsGestor()){
                            consulta+="G";
                        }
                        else{
                            consulta+="E";
                        }
                        
                        consulta+="' WHERE IdUsuario =" + user.getIdUsuario().toString() + ";";
                        
                           try {
            ConexionBD.getInstancia().conectar();
            ConexionBD.getInstancia().actualizar(consulta);
            ConexionBD.getInstancia().desconectar();
        } catch (SQLException ex) {
            System.out.println(ex);
            salida=false;
        }
        return salida;
    
     }
    
    
    
        public Usuario getIdUsuario(int idUsuario){
        String consulta  =  "SELECT * FROM Usuario WHERE IdUsuario = '" + idUsuario + "%';";
        
          Usuario user = new Usuario();
         
          try {
            ConexionBD.getInstancia().conectar();
            ResultSet tabla = ConexionBD.getInstancia().consultar(consulta);
            
              if(tabla.last()){
                  int numFilas = tabla.getRow();
                  tabla.beforeFirst();
                  Boolean gestor;
                  
                  for(int i=0; i<numFilas; i++){
                      tabla.next();
                      if(tabla.getString("tipoUsuario").equals("G")){
                          gestor = true;
                      }
                      else 
                          gestor = false;
                      
                      user = new Usuario(tabla.getString("DNI"), tabla.getString("Nombre"), tabla.getString("Apellidos"), tabla.getString("Login"), tabla.getString("Contrasena"), tabla.getString("Correo"), gestor);
                      user.setIdUsuario(tabla.getInt("IdUsuario"));
                  }
                }
              ConexionBD.getInstancia().desconectar();
        } catch(SQLException ex){
        return null;
        }
        return user;
     }
}
